home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Games / lptalk-1.3 / special.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  5KB  |  200 lines

  1. /************************************************************************/
  2. /* LP-Talk
  3.     Version 1.0 [ 9/24/90]
  4.     Version 1.1 [ 9/27/90]
  5.     Version 1.2 [ 9/28/90]
  6. */
  7. /* TinyTalk output special processing.                    */
  8. /*                                    */
  9. /*    Version 1.0 [ 2/ 2/90] : Extracted from main loop module; added */
  10. /*                 new features for release 1.1.        */
  11. /*                                    */
  12. /************************************************************************/
  13.  
  14. #include "tl.h"
  15. #include <stdio.h>
  16.  
  17. extern char *index();
  18. extern world_rec *find_world();
  19.  
  20. #define MAX_QUIET 25            /* Max lines to quiet during login. */
  21. #define MAX_BEEPS 5            /* Be reasonable!  Note--you must */
  22.                     /* change do_beep() if this is */
  23.                     /* increased. */
  24.  
  25. static int quiet_mode;            /* Suppress login messages? */
  26. static int quiet_waiting;        /* Are we in a login process? */
  27. static int quiet_counter;        /* So quietness eventually goes off. */
  28.  
  29. static int beep_count;            /* How many times should we beep? */
  30.  
  31. set_quiet()
  32. {
  33.   quiet_mode = TRUE;
  34. }
  35.  
  36. clear_quiet()
  37. {
  38.   quiet_mode = FALSE;
  39.   quiet_waiting = FALSE;        /* Need to initialize this, too. */
  40. }
  41.  
  42. start_quiet()
  43. {
  44.   if (quiet_mode) {
  45.     quiet_waiting = TRUE;
  46.     quiet_counter = 0;
  47.   }
  48. }
  49.  
  50. stop_quiet()
  51. {
  52.   quiet_waiting = FALSE;
  53. }
  54.  
  55. int keep_quiet(what)            /* Returns 1 if should suppress. */
  56.   char *what;
  57. {
  58.   if (!strncmp(what, "-------------------", 19)) {
  59.     quiet_waiting = FALSE;        /* No longer waiting. */
  60.     return (1);                /* Suppress this line. */
  61.   }
  62.  
  63.   quiet_counter++;            /* Don't stay quiet forever, even */
  64.   if (quiet_counter > MAX_QUIET) {    /* if we never see the right string. */
  65.     quiet_waiting = FALSE;
  66.     return (0);
  67.   }
  68.   else
  69.     return (1);
  70. }
  71.  
  72.   /* Quiet logins are also handled here. */
  73.  
  74. int special_hook(what)            /* Check for special thingies. */
  75.   register char *what;
  76. {
  77.   smallstr name;
  78.   char *end;
  79.  
  80.   if (quiet_waiting && keep_quiet(what))
  81.     return (1);
  82.  
  83.   if (!strncmp(what, "#### Please reconnect to ", 25)) /* Portal? */
  84.     return (handle_portal(what));
  85.  
  86.   end = index(what, ' ');    /* Get rest of sentence after name. */
  87.  
  88.   if (end && !strncmp(end + 1, "tells you: ", 11)) { /* Handle tells. */
  89.     do_beep();
  90.     if (should_hilite_tells())
  91.       hilite_on();
  92.     print_with_wrap(what);
  93.     if (should_hilite_tells())
  94.       hilite_off();
  95.     return (1);
  96.   }
  97.  
  98.   extract_first_word(what, name);    /* Get first word (speaker). */
  99.  
  100.   if (is_other_whisper(what))        /* Check for whispers to others. */
  101.     return (1);
  102.  
  103.   if (should_hilite(what, name)) {    /* Check for hiliting. */
  104.     hilite_on();
  105.     print_with_wrap(what);
  106.     hilite_off();
  107.     return (1);
  108.   }
  109.  
  110.   if (is_gagged(what, name))        /* Check for gagging. */
  111.     return (1);
  112.  
  113.   return (0);                /* Otherwise, just pass it through. */
  114. }
  115.  
  116. extract_first_word(what, name)
  117.   char *what, *name;
  118. {
  119.   register char *place, save;
  120.  
  121.   place = index(what, ' ');
  122.   if (place != NULL) {
  123.     save = *place;
  124.     *place = '\0';
  125.   }
  126.  
  127.   strncpy(name, what, SMALLSTR);    /* Extract the name. */
  128.   name[SMALLSTR] = '\0';
  129.  
  130.   if (place != NULL)            /* Restore killed character. */
  131.     *place = save;
  132. }
  133.  
  134.   /* Handle portals. */
  135.   /* Format is: ... to WORLD@IP-addr (hostname) port ??? #### */
  136.  
  137. int handle_portal(what)
  138.   char *what;
  139. {
  140.   string world, address, port, temp;
  141.   int count;
  142.   char *place, ch;
  143.   register world_rec *where;
  144.  
  145.   count = sscanf(what, "#### Please reconnect to %s %s port %s ####",
  146.          world, address, port);
  147.   if (count != 3)
  148.     return (0);                /* Invalid format. */
  149.  
  150.   place = index(world, '@');        /* Strip off IP address. */
  151.   *place = '\0';
  152.  
  153.   ch = *(place+1);
  154.   if ((ch >= '0') && (ch <= '9'))    /* Use IP address if known. */
  155.     strcpy(address, place+1);        /* May not have nameservice--use IP. */
  156.   else {
  157.     strcpy(temp, address+1);        /* Strip parens. */
  158.     strcpy(address, temp);
  159.     address[strlen(address)-1] = '\0';
  160.   }
  161.  
  162.   where = find_world(world);        /* See if we know about it. */
  163.   if (where == NULL) {            /* Nope, build a new one instead. */
  164.     where = (world_rec *) malloc(sizeof(world_rec)); /* Never reclaimed! */
  165.     where->next = NULL;
  166.     strcpy(where->world, world);
  167.     *(where->character) = '\0';
  168.     *(where->pass) = '\0';
  169.     strcpy(where->address, address);
  170.     strcpy(where->port, port);
  171.   }
  172.  
  173.   if (connect_to(where))
  174.     magic_login();
  175.   else
  176.     fprintf(stderr,"%% Connection through portal failed.\n");
  177.  
  178.   return (1);                /* Yes, it was a portal. */
  179. }
  180.  
  181. init_beep()
  182. {
  183.   beep_count = 0;
  184. }
  185.  
  186. do_beep()
  187. {
  188.   if (beep_count != 0)
  189.     write(1, "\007\007\007\007\007", beep_count);
  190. }
  191.  
  192. set_beep(n)
  193.   int n;
  194. {
  195.   if (n > MAX_BEEPS)
  196.     beep_count = MAX_BEEPS;
  197.   else
  198.     beep_count = n;
  199. }
  200.